package pl.agh.pp.zephyr.model;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * Reprezentuje pokój, jako logiczne miejsce miksowania na jednym mcu. Może
 * zawierać połączenia do innych pokoji.
 * */
public class Room {
	
	// pierwsze MCU pokoju
	public final Mcu mcu;
	
	// zbiór mcu, na których postawiony jest pokój
	public final Set<Mcu> mcus = Collections
			.synchronizedSet(new HashSet<Mcu>());

	// nazwa
	public final String alias;

	// zbiór uczestników
	public final Set<User> members = Collections
			.synchronizedSet(new HashSet<User>());

	// zbiór połączeń z innymi pokojami
	public final Set<Room> connections = Collections
			.synchronizedSet(new HashSet<Room>());

	public Room(final String alias, final Mcu initialMcu) {
		super();
		if (initialMcu == null) {
			throw new NullPointerException("initialMcu cannot be null");
		}
		this.alias = alias;
		mcu = initialMcu;
		mcus.add(initialMcu);
	}

	/**
	 * @return czy pokój jest rozproszony
	 */
	public boolean isDistributed() {
		return connections.size() > 0 || mcus.size() > 1;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((alias == null) ? 0 : alias.hashCode());
		result = prime * result + ((mcu == null) ? 0 : mcu.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Room other = (Room) obj;
		if (alias == null) {
			if (other.alias != null)
				return false;
		} else if (!alias.equals(other.alias))
			return false;
		if (mcu == null) {
			if (other.mcu != null)
				return false;
		} else if (!mcu.equals(other.mcu))
			return false;
		return true;
	}

}
